`
_Yggd
  • 浏览: 89268 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

关于struts2字符过滤器有趣的代码,过滤器有问题的童靴可以戳进来看看

阅读更多
以下是struts2的拦截器 字符过滤(网上代码有很多,都和这个差不多(我亲测以后发现字符过滤还是不行,就自己弄了一个)):

有一个最简单的方法就是在你的struts.xml文件中添加:
<constant name="struts.i18n.encoding" value="GBK" /
>


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.fyz.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.StrutsRequestWrapper;
import org.apache.struts2.interceptor.ServletRequestAware;

/**
*
* @author RDGFT
*/
public class EncodingInterceptor extends AbstractInterceptor {

    private HttpServletRequest request;

    /**
     * @return the request
     */
    public HttpServletRequest getRequest() {
return request;
    }

    /**
     * @param request the request to set
     */
    public void setRequest(HttpServletRequest request) {
this.request = request;
    }

    private class Request extends StrutsRequestWrapper {
//从web.xml文件中设置的编码

private String encoding = null;
//构造器

public Request(HttpServletRequest request) {
    super(request);
    encoding = "gbk";//设置编码
}

/**
* 转换编码,由原来的西欧字符集转换成为设定的预设字符集
*/
public String Encoding(String input) {
    if (input == null) {
return null;
    } else {
try {
    return new String(input.getBytes("iso-8859-1"), encoding);
} catch (UnsupportedEncodingException ex) {
    Logger.getLogger(EncodingInterceptor.class.getName()).log(Level.SEVERE, null, ex);
}
    }
    return null;
}

/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest() {
    return (HttpServletRequest) super.getRequest();
}

/**
* 对父类的方法进行重写
*/
@Override
public String getParameter(String name) {
    return Encoding(getHttpServletRequest().getParameter(name));
}

/**
* 对父类的方法进行重写
*/
@Override
public String[] getParameterValues(String name) {
    String values[] = getHttpServletRequest().getParameterValues(name);
    if (values != null) {
for (int i = 0; i < values.length; i++) {
    values[i] = Encoding(values[i]);
}
    }
    return values;
}
    }

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
ActionContext actionContext = ai.getInvocationContext();
this.request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
if (this.request.getMethod().compareToIgnoreCase("post") >= 0) {
    this.getRequest().setCharacterEncoding("GBK");
    System.out.println("进入拦截器post");

} else {
    this.setRequest(new Request(this.request));
    System.out.println("进入拦截器get");
}
return ai.invoke();
    }
}


关于上述代码,我根据网上的代码改了改,初级版本是继承RequestAware(是不是这个,大家明白就行了)接口,但是request是null
你现在看到的版本扩展了request不是null(转码失败),


struts.xml文件:
<interceptors>
    <interceptor name="Encoding" class="com.fyz.interceptor.EncodingInterceptor"></interceptor>
    <interceptor-stack name="Encod">
<interceptor-ref name="Encoding"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref><!-- 必须引入这个,否则request不会再往下传-->
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="Encod"></default-interceptor-ref>

大家可以试试是不是我说的那样



以下struts2过滤器本人亲测是可行的代码:


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.fyz.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;



/**
*
* @author RDGFT
*/
public class EncodingFilter extends StrutsPrepareAndExecuteFilter implements Filter{
   private String encoding = "";

    //扩展原来的request,使原来的用get方法得到的参数转换成相应的编码,不影响原来的功能
    private class Request extends HttpServletRequestWrapper {
//从web.xml文件中设置的编码

private String encoding = null;
//构造器

public Request(HttpServletRequest request) {
    super(request);
    encoding = this.encoding;//设置编码
}

/**
* 转换编码,由原来的西欧字符集转换成为设定的预设字符集
*/
public String Encoding(String input) {
    if (input == null) {
return null;
    } else {
try {
    System.out.println(input);
    return new String(input.getBytes("iso-8859-1"), encoding);
} catch (UnsupportedEncodingException ex) {
    Logger.getLogger(EncodingFilter.class.getName()).log(Level.SEVERE, null, ex);
}
    }
    return null;
}

/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest() {
    return (HttpServletRequest) super.getRequest();
}

/**
* 对父类的方法进行重写
*/
@Override
public String getParameter(String name) {
    return Encoding(getHttpServletRequest().getParameter(name));
}

/**
* 对父类的方法进行重写
*/
@Override
public String[] getParameterValues(String name) {
    String values[] = getHttpServletRequest().getParameterValues(name);
    if (values != null) {
for (int i = 0; i < values.length; i++) {
    values[i] = Encoding(values[i]);
}
    }
    return values;
}
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (req.getMethod().compareToIgnoreCase("post") >= 0) {
    request.setCharacterEncoding(encoding);
} else {
    request = new Request(req);
     System.out.println("get方法中");
}


chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
System.out.println(encoding);
    }
}

web.xml文件的配置如下:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
   
  
   
   
    <!-- struts2的和核心过滤器-->
    <filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
    </filter-mapping>
   
   
     <filter>
        <filter-name>CharsetEncodingFilter</filter-name>
        <filter-class>com.fyz.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharsetEncodingFilter</filter-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
        <dispatcher>ANSYC</dispatcher>
        <!-- 异步处理请求-->
        <!--对全站点进行编码转换 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
   
   
    <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <session-config>
<session-timeout>
    30
</session-timeout>
    </session-config>
    <jsp-config>
<taglib>
    <taglib-uri>http://com.fyz/tagslib</taglib-uri>
    <taglib-location>/WEB-INF/mypage.tld</taglib-location>
</taglib>
    </jsp-config>
</web-app>


[align=left]注意:

[/align]

web.xml文件过滤器的配置的顺序问题。一定是自定义的过滤器在前,然后struts2的
核心过滤器在后(要不然还是转码失败)


希望路过的各位大神不吝赐教
分享到:
评论

相关推荐

    操作系统中关于处理机调度的代码示例

    操作系统中关于处理机调度的代码示例 操作系统中关于处理机调度的代码示例是操作系统中一个重要的概念,它涉及到进程的调度和管理。在这个代码示例中,我们可以看到两个主要的调度算法:动态进程优先调度算法和时间...

    java2word.jar和java2word.exe

    java操作word用的java2word.jar和java2word.exe。java读写word动态向word模板总填充数据,支持2003、2007、2010word版本。功能简单强大。需要的童靴可以试一下,代码很简单。

    STM32入门学习资料,深入浅出的讲解,非常适合刚刚接触STM32的童靴

    - **开发工具**: 推荐使用STM32CubeMX进行项目初始化配置,可以快速生成HAL库或LL库代码。 - **在线课程与书籍**: 可以参考《零死角玩转STM32》系列书籍,特别是针对F1系列的学习资料,非常适合初学者。 - **社区...

    23333_understanding2j7_possible2h6_原型演示_

    标题中的“23333_understanding2j7_possible2h6_原型演示_”可能是一个项目代码或者版本标识,它并非直接与IT知识点相关,但可以推测这可能是一个关于原型设计的项目或教程,其中“理解2j7”和“可能的2h6”可能是...

    PS教程——Photoshop经典实例教程3000例

    PS学习教程,想学习PS的童靴可以下来看看

    数值分析算法那

    描述数值分析算法原理,并有c代码,适用于研究算法的童靴们

    高焕堂讲义资料zip.001

    全套高焕堂讲义资料,需要的童靴可以拿去看看,不过分数有点高,毕竟我也是发钱听得课,一共四卷,总共20分,必须全部下载才能打开

    Java文档五百篇

    是介绍java的不错的书籍哦,童靴们可以下载看看哦

    jsoup1.7.2

    jsoup1.7.2,jd2chm工具制作的,保证可以使用,有兴趣的童靴可以下载!!

    ibatis小例子

    【标题】"ibatis小例子"揭示了一个关于iBatis框架的初级教程,它是一个用于Java应用程序的持久层框架,特别适用于那些希望将SQL映射到Java代码中的开发者。iBatis提供了一种灵活的方式,使得数据库交互变得更加简单...

    上位机控制三菱变频器 DEMO (VB.NET), (可编辑上位机与三菱PLC,西门子PLC通讯, 数据采集,)源码带详细注

    上位机控制三菱变频器 DEMO (VB.NET), ...本程序有详细步骤和超详细的中文注释,可以控制多台变频器,采用modbus协议 ,内有CRC计算程序代码,有需要学习自动化控制的及上位机软件控制的童靴 学习

    高焕堂讲义资料zip.004

    全套高焕堂讲义资料,需要的童靴可以拿去看看,不过分数有点高,毕竟我也是发钱听得课,一共四卷,总共20分,必须全部下载才能打开

    高焕堂讲义资料zip.003

    全套高焕堂讲义资料,需要的童靴可以拿去看看,不过分数有点高,毕竟我也是发钱听得课,一共四卷,总共20分,必须全部下载才能打开

    高焕堂讲义资料zip.002

    全套高焕堂讲义资料,需要的童靴可以拿去看看,不过分数有点高,毕竟我也是发钱听得课,一共四卷,总共20分,必须全部下载才能打开

    mongodb net驱动源码

    mongodb net驱动源码,使用.net的童靴可以用它方便的连接mongodb 数据库。

    STM32深入浅出

    STM32_深入浅出 - STM32 学前班教程之一:为什么是它 经过几天的学习,基本掌握了 STM32 的调试环境和一些基本知识。想拿出来与大家共享

    面试问题(超全)

    这是本人总结的最全的一套面试题,上百家大型公司的面试题,如果全部搞会,面试最低5--6k是没有问题的,希望可以助那些还在为找到工作而发愁的童靴们找到一份满意的工作!

    传智播客ios第四期就业班视频下载地址及解压密码(免积分)版

    有了这套视频教程,完全可以在家里自己学习。因为视频和实培训是一模一样的,对于经济条件不好的同学,这样的视频教程就更加珍贵了。。 需要说的是,现在ios真的很火,工资也非常高。所以往ios方面发展的同学拿到...

Global site tag (gtag.js) - Google Analytics