struts2 编码过滤器过滤器干什么用的

struts2 过滤器实现权限控制 - 推酷
struts2 过滤器实现权限控制
管理员类:
package com.xeon.mis.
import javax.persistence.C
import javax.persistence.E
import javax.persistence.GeneratedV
import javax.persistence.GenerationT
import javax.persistence.Id;
import javax.persistence.T
import org.
public class Manager {
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
public void setId(int id) {
@Column(name = &name&, length = 16)
public String getName() {
public void setName(String name) {
this.name =
public int getType() {
public void setType(int type) {
this.type =
@Column(name = &password&, length = 32)
public String getPassword() {
public void setPassword(String password) {
this.password =
过滤器定义:
package com.xeon.mis.
import java.io.IOE
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
public class UserLoginFilter implements Filter {
public void destroy() {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(&----------过滤前-------------&);
HttpServletRequest req = (HttpServletRequest)
HttpServletResponse resp = (HttpServletResponse)
HttpSession session = req.getSession(false);
String uri = req.getRequestURI();
// 除了来自登录页面否则进行session验证
if ((!uri.contains(&/login.html&))) {
if (session == null) {
resp.sendRedirect(req.getContextPath() + &/login.html&);
int permission = Integer.parseInt(session
.getAttribute(&permission&).toString());
if (permission & 0) {
chain.doFilter(request, response);
chain.doFilter(request, response);
System.out.println(&----------过滤后-------------&);
public void init(FilterConfig config) throws ServletException {
web.xml配置过滤器:
&filter-name&login&/filter-name&
&filter-class&com.xeon.mis.filter.UserLoginFilter&/filter-class&
&filter-mapping&
&filter-name&login&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
利用Struts2的action作为控制器:
package com.xeon.mis.
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import org.apache.struts2.ServletActionC
import com.opensymphony.xwork2.ActionS
import com.xeon.mis.dao.ManagerD
import com.xeon.mis.model.M
import com.xeon.mis.utils.MD5U
public class AuthAction extends ActionSupport {
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter(&username&);
String password = MD5Utils.MD5(request.getParameter(&password&));
Manager manager = new ManagerDao().auth(username, password);
if (manager == null) {
return ERROR;
HttpSession session = request.getSession();
session.setAttribute(&permission&, manager.getType());
return SUCCESS;
struts.xml
&action name=&auth& class=&com.xeon.mis.action.AuthAction&&
&result name=&success&&/index.html&/result&
&result name=&error&&/error.jsp&/result&
其中我对密码使用MD5加密技术
package com.xeon.mis.
import java.security.MessageD
import java.security.NoSuchAlgorithmE
public class MD5Utils {
* 返回值为32位的加密数据
public final static String MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
byte[] btInput = s.getBytes();
MessageDigest mdInst = MessageDigest.getInstance(&MD5&);
mdInst.update(btInput);
byte[] md = mdInst.digest();
int j = md.
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i & i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 &&& 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
return new String(str);
} catch (Exception e) {
e.printStackTrace();
public static void main(String[] args) {
System.out.println(MD5(&admin&));
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致博客访问: 4004459
博文数量: 661
博客积分: 10821
博客等级: 上将
技术积分: 11144
注册时间:
认证徽章:
专注与操作系统相关的云计算,linux,openstack,spark, hadoop
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
下面是部分解析,持续更新中。。。
&&&&&& 近期在看struts2,在看到论坛上有人分析了StrutsPrepareAndExecuteFilter的源码,感觉这个类是很核心的,可以知道struts2拦截到用户请求之后是如何对参数进行转换的。我就按图索骥,也来走读一下这个类的代码,大家多指教。
在使用struts的时候要在web.xml中配置一个过滤器,来拦截用户发起的请求,并进行一些预处理,根据配置文件把请求分配给对应的action并将请求中的参数与action中的字段进行对应赋值。现在就来解读一下,这背后都发生了哪些事情。
在一些介绍struts2的博客中,使用的过滤器是FilterDispatcher,在文档中我们可以看到如下的说明:
Deprecated.Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one
StrutsPrepareAndExecuteFilter的说明如下:
Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use when you don't have another filter that needs access to action context information, such as Sitemesh.
这2个说明就不做过多的说明了。Web.xml中配置过滤器的代码片段如下:
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
要构建一个过滤器很简单就是实现javax.servlet.Filter接口即可。这个接口有三个方法:
?& init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。
?& doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain 对象。
?& destroy() :正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。
& 正如文档中的描述,use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter,在StrutsPrepareAndExecuteFilter类中有2个字段,分别声明了StrutsPrepareFilter与StrutsExecuteFilter的实例。现在先来看看init方法
&&& public void init(FilterConfig filterConfig) throws ServletException {
&&& //一个集中了多个初始化方法的工具类
&&&&&&& InitOperations init = new InitOperations();
&&&&&&& try {
&&&&&&& //包装javax.servlet.FilterConfig对象
//重新实现了getInitParameterNames()方法
//把返回值由Enumeration类型转化为Iterator类型
&&&&&&&&&&& FilterHostConfig config = new FilterHostConfig(filterConfig);
&&&&&&&&&&& //初始化日志
&&&&&&&&&&& init.initLogging(config);
&&&&&&&&&&& //创建Dispatcher 包含了2方面的信息:servletcontext,拦截器的配置参数
&&&&&&&&&&& //同时指定了初始化配置文件的顺序
&&&&&&&&&&& Dispatcher dispatcher = init.initDispatcher(config);
&&&&&&&&&&& init.initStaticContentLoader(config, dispatcher);
&&&&&&&&&&& //PrepareOperations为请求处理做一些准备工作
&&&&&&&&&&& prepare =
new PrepareOperations(filterConfig.getServletContext(), dispatcher);
&&&&&&&&&&& execute =
new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
//哪些请求是被过滤掉的, 不执行拦截器
&&&&&&&&& this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
&&&&&&&&&&& //回调方法
&&&&&&&&&&& postInit(dispatcher, filterConfig);
&&&&&&& } finally {
&&&&&&&&&&& init.cleanup();
新建dispatcher的代码如下:
&&& private Dispatcher createDispatcher( HostConfig filterConfig ) {
&&&&&&& Map params = new HashMap();
&&&&&&& for ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext();){
&&&&&&&&&&& String name = (String) e.next();
&&&&&&&&&&& String value = filterConfig.getInitParameter(name);
&&&&&&&&&&& params.put(name, value);
&&&&&&& return new Dispatcher(filterConfig.getServletContext(), params);
private void init_DefaultProperties() {
&&&&&&& configurationManager.addConfigurationProvider(new DefaultPropertiesProvider());
&&&& doFilter是过滤器的执行方法,它拦截提交的HttpServletRequest请求,HttpServletResponse响应,是strtus2的核心拦截器。简单的分析如下:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
&&& HttpServletRequest request = (HttpServletRequest)
HttpServletResponse response = (HttpServletResponse)
&&&&& //设置字符编码集
&&&&& prepare.setEncodingAndLocale(request, response);
&&&&& //创建actioncontext
&&&&& prepare.createActionContext(request, response);
&&&&& //Dispater有一个静态的Threadlocal变量,为每个线程保存一个副本
&&&&& prepare.assignDispatcherToThread();
&&&& if ( excludedPatterns != null &&
prepare.isUrlExcluded(request, excludedPatterns)) {
&&&&&&&& chain.doFilter(request, response);
&&& } else {
&&&&&&& //如果是文件上传请求会封装称:MultiPartRequestWrapper
//否则为:StrutsRequestWrapper
&&&&&&& //封装之后可以访问actioncontext,并使用OGNL表达式了
&&&&&&& request = prepare.wrapRequest(request);
&&&&&&& //No mapping will be created in the case of static resource requests
&&&&&&& //or unidentifiable requests for other servlets
&&&&&&& ActionMapping mapping = prepare.findActionMapping(
request, response, true);
&&&&&&& if (mapping == null) {
&&&&&&&&&&& //Tries to execute a request for a static resource
&&&&&&&&&&& //对这个没有一个太感性的认识
&&&&&&&&&&& boolean handled =
execute.executeStaticResourceRequest(request, response);
&&&&&&&&&&& if (!handled) {
&&&&&&&&&&&&&&& chain.doFilter(request, response);
&&&&&&&&&&& }
&&&&&&& } else {
&&&&&&&&&&& //处理请求,读取配置文件,利用反射机制生成一个action代理
&&&&&&&&&&& execute.executeAction(request, response, mapping);
& } finally {
&&&&& prepare.cleanupRequest(request);
参照文档:
为请求新建一个actioncontext的代码如下:
public ActionContext createActionContext(
HttpServletRequest request, HttpServletResponse response) {
&& ActionC
&& Integer counter = 1;
&& //暂时不知道这个计数器有啥用
& Integer oldCounter = (Integer) request.getAttribute(CLEANUP_RECURSION_COUNTER);
& if (oldCounter != null) {
&&&&& counter = oldCounter + 1;
& ActionContext oldContext = ActionContext.getContext();
& if (oldContext != null) {
&&&&& // detected existing context, so we are probably in a forward
&&&&& ctx = new ActionContext(
new HashMap(oldContext.getContextMap()));
& } else {
&&&&& ValueStack stack = dispatcher.getContainer().getInstance
(ValueStackFactory.class).createValueStack();
&&&&& //stack.getContext()就是个Map
&&&&& //dispatcher.createContextMap()封装了http请求相关的信息
&&&&& //比如:request,reponse,ServletContext,http parameters,session,application
&&&&& //感觉所谓的context其实就可以认为是一个集合类,保存了http请求的相关信息
&&&&& stack.getContext().putAll(dispatcher.createContextMap(
request, response, null, servletContext));
//通过这里我们看出来,actioncontext包含了哪些东西:
//request,reposne,session,application中的参数以及valuestack。
&&&& //通过OGNL获取数据的方式可以得到对应
&&&& ctx = new ActionContext(stack.getContext());
& request.setAttribute(CLEANUP_RECURSION_COUNTER, counter);
& ActionContext.setContext(ctx);
阅读(14571) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。登录过滤器(Struts2)
我的图书馆
登录过滤器(Struts2)
最近,在做权限验证的时候,要通过用户登录,判断用户的权限,根据权限显示不同的东西和操作。这样就登录验证就必须要做了。进入系统的用户必须得登录才能进入系统。否则跳转到登录页面。
在网上也找了不少的资料,大体是用两种方法可以实现。
一、使用struts2的拦截器(Interceptor)
&&&&& struts2的拦截器很灵活,可以在每个action中配置不同的拦截器,也可以配置通用的。像下面这样……
&interceptors&&&
&&&&&&&&&interceptor&name="authority"&class="cn.common.AuthorityInterceptor"/&&&
&&&&&&&&&interceptor-stack&name="myStack"&&&
&&&&&&&&&&&&&interceptor-ref&name="defaultStack"/&&&
&&&&&&&&&&&&&interceptor-ref&name="authority"/&&&
&&&&&&&&&/interceptor-stack&&&
&&&&&/interceptors&&&
&&&&&default-interceptor-ref&name="myStack"&&/default-interceptor-ref&&&
&&&&&!--&全局的跳转结果&和下面的action中是对应的&--&&&&
&&&&&global-results&&&
&&&&&&&&&result&name="login"&/login.jsp&/result&&&
&&&&&/global-results&&&
AuthorityInterceptor.java如下
public&class&AuthorityInterceptor&extends&AbstractInterceptor&{&&
&&&&@Override&&
&&&&public&String&intercept(ActionInvocation&invocation)&throws&Exception&{&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&ActionContext&ctx&=&invocation.getInvocationContext();&&&
&&&&&&&&Map&session&=&ctx.getSession();&&&
&&&&&&&&&&
&&&&&&&&NiUser&user&=&(NiUser)session.get("user");&&&
&&&&&&&&&&
&&&&&&&&if&(user&!=&null)&&&
&&&&&&&&{&&&
&&&&&&&&&&&&return&invocation.invoke();&&&
&&&&&&&&}&&&
&&&&&&&&&&
&&&&&&&&ctx.put("tip"&,&"您还没有登陆,请输入scott,tiger登陆系统");&&&
&&&&&&&&&&
&&&&&&&&return&Action.LOGIN;&&&
&&&&&&&&&&
此种做法可以实现url的拦截,但是,有一点,他只能在拦截器所配置的package下起作用,其他的package下仍然可以不登录通过url访问。还需要在每个package下都配置一遍,我不知道还有没有其他的方法。拦截器给我的感觉就是很灵活,灵活的代价是增加了代码量。不知道理解的对不对?
二、Filter(基于javax.servlet.Filter)
&&&& 它需要在web.xml中做如下配置
&&&&&&&&loginFilter&&&&&
&&&&&&&&org.springframework.web.filter.DelegatingFilterProxy&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&targetFilterLifecycle&&&&&
&&&&&&&&&&&&&&true&&&&&
&&&&&&&&&&&&&
&&&&&&&&loginFilter&&
&&&&&&&&/*&&
&&&& 同样要有个java文件与之对应
public&class&LoginFilter&extends&HttpServlet&implements&Filter&{&&
&&&&private&static&final&long&serialVersionUID&=&1L;&&
&&&&public&void&init(FilterConfig&arg0)&throws&ServletException&{&&
&&&&&&&&&&
&&&&public&void&doFilter(ServletRequest&sRequest,&ServletResponse&sResponse,&&&&&&
&&&&&&&&&&&&FilterChain&filterChain)&throws&IOException,&ServletException{&&&
&&&&&&&&HttpServletRequest&request&=&(HttpServletRequest)&sR&&&&&&
&&&&&&&&HttpServletResponse&response&=&(HttpServletResponse)&sR&&&&&&
&&&&&&&&HttpSession&session&=&request.getSession();&&&&&&
&&&&&&&&String&url=request.getServletPath();&&
&&&&&&&&String&contextPath=request.getContextPath();&&
&&&&&&&&if(url.equals(""))url+="/";&&
&&&&&&&&if((url.startsWith("/")&&!url.startsWith("/login"))){&&
&&&&&&&&&&&&&NiUser&user=(NiUser)session.getAttribute("user");&&
&&&&&&&&&&&&&if(user==null){&&
&&&&&&&&&&&&&&&&&&response.sendRedirect(contextPath+"/login.action");&&
&&&&&&&&&&&&&&&&&&return;&&
&&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&filterChain.doFilter(sRequest,&sResponse);&&&&
&&& 以上两种方法都能实现防止不经登录直接url访问,但Filter似乎简单些,不知道有没有其他的缺点或者不安全的地方。
TA的最新馆藏[转]&[转]&

我要回帖

更多关于 struts2 编码过滤器 的文章

 

随机推荐