java web编程中解决字符的另一招(RequestProcessor)

以前我都是用Filter (servlet)过滤器去 解决中文乱码(字符集)的问题 ,需要在web.xml配置2处。
但是今天 发现 RequestProcessor也可以解决字符集问题。 只需在web.xml种 配置一处 即可。
在此做个备忘!
java 代码
  1. MyRequestProcessor.java
  2. package StudyNews;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.apache.struts.action.RequestProcessor;
  7. import org.apache.struts.config.ForwardConfig;
  8. import org.apache.commons.logging.Log;
  9. public class MyRequestProcessor extends RequestProcessor {
  10. public MyRequestProcessor() {}
  11. protected boolean processPreprocess( HttpServletRequest request,
  12. HttpServletResponse response ){
  13. try{
  14. request.setCharacterEncoding("latin1");//此处为自己用的数据库的字符集 <4>
  15. }
  16. catch(Exception ex){
  17. System.out.println("字符集设置失败");
  18. }
  19. return true;
  20. }
  21. }
xml
xml 代码
  1. <controller processorClass="StudyNews.MyRequestProcessor" />

---------------------------------
java 代码
  1. import java.io.IOException;
  2. import javax.servlet.Filter;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.FilterConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. public class SetCharacterEncodingFilter implements Filter {
  9. /*
  10. * (非 Javadoc)
  11. *
  12. * @see javax.servlet.Filter#destroy()
  13. */
  14. public void destroy() {
  15. this.encoding = null;
  16. this.filterConfig = null;
  17. }
  18. public void doFilter(ServletRequest request, ServletResponse response,
  19. FilterChain chain) throws IOException, ServletException {
  20. // 选择使用的字符编码
  21. if (ignore ¦ ¦ (request.getCharacterEncoding() == null)) {
  22. String encoding = selectEncoding(request);
  23. if (encoding != null) {
  24. request.setCharacterEncoding(encoding);
  25. }
  26. // 将控制权交给下一个Filter
  27. chain.doFilter(request, response);
  28. }
  29. }
// 将这个filter放置在服务中
java 代码
  1. /*
  2. * (非 Javadoc)
  3. *
  4. * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
  5. */
  6. public void init(FilterConfig filterConfig) throws ServletException {
  7. this.encoding = filterConfig.getInitParameter( "encoding ");
  8. String value = filterConfig.getInitParameter( "ignore ");
  9. if (value == null)
  10. this.ignore = true;
  11. else if (value.equalsIgnoreCase( "true "))
  12. this.ignore = true;
  13. else if (value.equalsIgnoreCase( "yes "))
  14. this.ignore = true;
  15. else
  16. this.ignore = false;
  17. }
  18. protected String selectEncoding(ServletRequest request) {
  19. return (this.encoding);
  20. }
  21. protected String encoding = null;
  22. protected FilterConfig filterConfig = null;
  23. protected boolean ignore = true;
  24. }
在web.xml文件中加入以下代码
xml 代码
xml 代码
 
  1. <filter>  <filter-name> SetCharacterEncodingFilter </filter-name>  <filter-class> SetCharacterEncodingFilter </filter-class>  <init-param>  <param_name> encoding </param_name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> SetCharacterEncodingFilter </filter-name>  <url_pattern> /* </url_pattern>  </filter-mapping>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
布隆过滤器是一种空间效率很高的概率型数据结构,常用于判断一个元素是否在一个集合。在防止重复提交的场景,可以使用布隆过滤器来判断某个请求是否已经被处理过。 以下是一个简单的布隆过滤器的实现: ```java import java.util.BitSet; public class BloomFilter { private BitSet bitSet; private int size; private int hashFuncNum; public BloomFilter(int size, int hashFuncNum) { this.size = size; this.hashFuncNum = hashFuncNum; bitSet = new BitSet(size); } public void add(String str) { for (int i = 0; i < hashFuncNum; i++) { int hash = hash(str, i); bitSet.set(hash, true); } } public boolean contains(String str) { for (int i = 0; i < hashFuncNum; i++) { int hash = hash(str, i); if (!bitSet.get(hash)) { return false; } } return true; } private int hash(String str, int i) { int hash = 0; for (int j = 0; j < str.length(); j++) { hash = hash * i + str.charAt(j); } return Math.abs(hash) % size; } } ``` 在使用布隆过滤器防止重复提交时,可以在处理请求之前使用布隆过滤器判断该请求是否已经处理过,如果已经处理过则直接返回结果,否则继续处理请求并将请求的关键信息添加到布隆过滤器。 以下是一个使用布隆过滤器防止重复提交的示例: ```java public class RequestProcessor { private BloomFilter filter; public RequestProcessor(int size, int hashFuncNum) { filter = new BloomFilter(size, hashFuncNum); } public String process(Request request) { // 判断请求是否已经处理过 if (filter.contains(request.getKey())) { return request.getPreviousResult(); } // 处理请求 String result = doProcess(request); // 将请求的关键信息添加到布隆过滤器 filter.add(request.getKey()); return result; } private String doProcess(Request request) { // 实际的请求处理逻辑 return "result"; } } ``` 在上述示例,使用布隆过滤器判断请求是否已经处理过的时间复杂度是 O(k),其 k 是 hashFuncNum,通常情况下 k 的值较小,因此布隆过滤器的时间复杂度非常低,适合在高并发场景下使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值