📄 multilanguagefilter.java
字号:
package cn.myapps.base.web.filter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;
import cn.myapps.constans.Web;
import cn.myapps.core.multilanguage.ejb.LanguageType;
import cn.myapps.core.multilanguage.ejb.MultiLanguage;
import cn.myapps.core.multilanguage.ejb.MultiLanguageProcess;
import cn.myapps.core.user.action.WebUser;
import cn.myapps.util.ProcessFactory;
public final class MultiLanguageFilter implements Filter {
static MultiLanguageProcess mp;
public void doFilter(ServletRequest rq, ServletResponse rs,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) rq;
String uri = hreq.getRequestURI();
String contextPath = hreq.getContextPath();
if (uri.indexOf(".action") < 0 && uri.indexOf(".jsp") < 0
&& uri.indexOf(".htm") < 0 && !uri.equals(contextPath)
&& !uri.equals(contextPath+"/")) {
chain.doFilter(rq, rs);
return;
}
HttpServletResponse response = (HttpServletResponse) rs;
ReplaceTextWrapper myResponse = new ReplaceTextWrapper(hreq, response);
chain.doFilter(rq, myResponse);
myResponse.setContentLength(myResponse.getSize());
myResponse.flushBuffer();
}
public void destroy() {
}
public void init(FilterConfig filterConfig) {
try {
mp = (MultiLanguageProcess) ProcessFactory
.createProcess(MultiLanguageProcess.class);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static String replaceText(String text, int languageType) {
try {
String rtext = text.replaceAll("[\t\n\'\"\f\r]", "");
MultiLanguage language = mp.doView(languageType, rtext);
String newText = "";
if (language != null) {
newText = language.getText();
return newText;
}
} catch (Exception e) {
e.printStackTrace();
}
return text;
}
}
class ReplaceTextWrapper extends HttpServletResponseWrapper {
private ServletResponse inResp;
private ServletRequest inRequ;
private ReplaceTextStream outStream;
private MyPrintWriter outWriter;
public ReplaceTextWrapper(ServletRequest inRequ, ServletResponse inResp)
throws java.io.IOException {
super((HttpServletResponse) inResp);
this.inResp = inResp;
this.inRequ = inRequ;
}
public ServletOutputStream getOutputStream() throws java.io.IOException {
outStream = new ReplaceTextStream(inRequ, inResp);
return outStream;
}
public PrintWriter getWriter() throws java.io.IOException {
outWriter = new MyPrintWriter(inRequ, inResp);
return outWriter;
}
public int getSize() {
int count = 0;
if (outStream != null) {
count += outStream.getSize();
}
if (outWriter != null) {
count += outWriter.getSize();
}
// System.out.println("size->"+count);
return count;
}
}
class ReplaceTextStream extends ServletOutputStream {
int flag;
int count;
int[] buf;
int languageType;
int size;
OutputStream outStream;
public ReplaceTextStream(ServletRequest inRequ, ServletResponse inResp)
throws IOException {
HttpSession session = ((HttpServletRequest) inRequ).getSession();
WebUser webUser = (WebUser) session
.getAttribute(Web.SESSION_ATTRIBUTE_USER);
if (webUser != null) {
languageType = webUser.getLanguageType();
} else {
languageType = LanguageType.LANGUAGE_TYPE_ENGLISH;
}
// inResp.setBufferSize(50 * 1024);
this.outStream = inResp.getOutputStream();
buf = new int[512];
}
private void writeToBuf(int b) {
int newcount = count + 1;
if (newcount > buf.length) {
int newbuf[] = new int[Math.max(buf.length << 1, newcount)];
System.arraycopy(buf, 0, newbuf, 0, count);
buf = newbuf;
}
buf[count] = b;
count = newcount;
}
private void clearBuf() throws IOException {
for (int i = 0; i < count; i++) {
outStream.write(buf[i]);
size++;
}
count = 0;
flag = 0;
}
public void write(int i) throws java.io.IOException {
switch (i) {
case '{':
if (flag == 0) {
flag = 1;
writeToBuf(i);
} else {
clearBuf();
outStream.write(i);
size++;
}
break;
case '*':
if (flag == 1) {
flag = 2;
writeToBuf(i);
} else if (flag == 4) {
flag = 5;
writeToBuf(i);
} else {
clearBuf();
outStream.write(i);
size++;
}
break;
case '[':
if (flag == 2) {
flag = 3;
writeToBuf(i);
} else {
clearBuf();
outStream.write(i);
size++;
}
break;
case ']':
if (flag == 3) {
flag = 4;
writeToBuf(i);
} else {
clearBuf();
outStream.write(i);
size++;
}
break;
case '}':
if (flag == 5) {
writeToBuf(i);
// start to replace
String origText = new String(buf, 3, count - 6);
String newText = MultiLanguageFilter.replaceText(origText,
languageType);
outStream.write(newText.getBytes());
size += newText.getBytes().length;
count = 0;
flag = 0;
} else {
clearBuf();
outStream.write(i);
size++;
}
break;
default:
if (flag == 3) {
writeToBuf(i);
} else {
if (count > 0)
clearBuf();
outStream.write(i);
size++;
}
break;
}
}
public void close() throws java.io.IOException {
if (count > 0)
clearBuf();
outStream.close();
}
public void flush() throws java.io.IOException {
if (count > 0)
clearBuf();
outStream.flush();
}
public int getSize() {
return size;
}
}
class MyPrintWriter extends PrintWriter {
int flag;
int count;
int[] buf;
int languageType;
int size;
public MyPrintWriter(ServletRequest inRequ, ServletResponse inResp)
throws IOException {
this(inResp.getWriter(), false);
this.out = inResp.getWriter();
HttpSession session = ((HttpServletRequest) inRequ).getSession();
WebUser webUser = (WebUser) session
.getAttribute(Web.SESSION_ATTRIBUTE_USER);
if (webUser != null) {
this.languageType = webUser.getLanguageType();
} else {
languageType = LanguageType.LANGUAGE_TYPE_ENGLISH;
}
}
public MyPrintWriter(Writer out, boolean autoFlush) {
super(out);
buf = new int[512];
}
public void flush() {
if (count > 0)
clearBuf();
super.flush();
}
public void close() {
if (count > 0)
clearBuf();
super.close();
}
public void write(char buf2[], int off, int len) {
for (int i = off; i < Math.min(off + len, buf2.length); i++) {
this.write((int) buf2[i]);
}
}
public void write(String s, int off, int len) {
super.write(s.toCharArray(), off, len);
}
private void writeToBuf(int b) {
int newcount = count + 1;
if (newcount > buf.length) {
int newbuf[] = new int[Math.max(buf.length << 1, newcount)];
System.arraycopy(buf, 0, newbuf, 0, count);
buf = newbuf;
}
buf[count] = b;
count = newcount;
}
public void write(int c) {
switch (c) {
case '{':
if (flag == 0) {
flag = 1;
writeToBuf(c);
} else {
clearBuf();
super.write(c);
size++;
}
break;
case '*':
if (flag == 1) {
flag = 2;
writeToBuf(c);
} else if (flag == 4) {
flag = 5;
writeToBuf(c);
} else {
clearBuf();
super.write(c);
size++;
}
break;
case '[':
if (flag == 2) {
flag = 3;
writeToBuf(c);
} else {
clearBuf();
super.write(c);
size++;
}
break;
case ']':
if (flag == 3) {
flag = 4;
writeToBuf(c);
} else {
clearBuf();
super.write(c);
size++;
}
break;
case '}':
if (flag == 5) {
writeToBuf(c);
// start to replace
String origText = new String(buf, 3, count - 6);
String newText = MultiLanguageFilter.replaceText(origText,
languageType);
super.write(newText);
size += newText.getBytes().length;
count = 0;
flag = 0;
} else {
clearBuf();
super.write(c);
size++;
}
break;
default:
if (flag == 3) {
writeToBuf(c);
} else {
if (count > 0)
clearBuf();
super.write(c);
size++;
}
break;
}
}
private void clearBuf() {
for (int i = 0; i < count; i++) {
super.write(buf[i]);
size++;
}
count = 0;
flag = 0;
}
public int getSize() {
return size;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -