Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现

对于Struts2、Spring3、Hibernate3集成使用的项目来说,对用户请求的控制是非常重要的,有些操作需要用户登录后才能执行。如果不做任何限制,则action可以直接在浏览器中输入action地址来执行相应的action.本文主要解决的就是

①浏览器地址栏中直接输入url访问action的问题

②过滤不想被拦截的方法

例如对于如下链接:

 

 
  1. http://localhost:8080/absSys/delete.action?id=1

直接在浏览器中提交上述地址,delete操作依然能执行!因此,必须对用户提交的请求进行拦截处理,如果用户没有登录,则跳转至登录页面。

一、浏览器地址栏中直接输入url访问action的问题

Struts2提供了拦截器,我们编写自己的拦截器的时候,只需要继承抽象类AbstractInterceptor,然后override intercept()方法就可以了。

 
  1. import java.util.Map;
  2. import com.opensymphony.xwork2.ActionContext;
  3. import com.opensymphony.xwork2.ActionInvocation;
  4. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  5.  
  6. public class LoginInterceptor extends AbstractInterceptor {
  7.  
  8. private static final long serialVersionUID = 1L;
  9.  
  10. public void destroy() {
  11.  
  12. System.out.println("Destory");
  13. }
  14.  
  15. public void init() {
  16.  
  17. System.out.println("Init");
  18. }
  19.  
  20. /**
  21. * @return result
  22. * */
  23. public String intercept(ActionInvocation invocation) throws Exception {
  24. System.out.println("action执行之前");
  25. String name = invocation.getInvocationContext().getName();
  26. System.out.println("请求方法:" + name);
  27. ActionContext ac = invocation.getInvocationContext();
  28. Map<String, Object> session = ac.getSession();
  29. boolean allow = name.equals("infolist") || name.equals("xwgg")
  30. || name.equals("pxdt") || name.equals("noticethrid")
  31. || name.equals("gqpx") || name.equals("gp")
  32. || name.equals("np") || name.equals("sp")
  33. || name.equals("wypx") || name.equals("zgks")
  34. || name.equals("shpx") || name.equals("fwxz")
  35. || name.equals("noticesec") || name.equals("filedown");
  36. if (name.equals("login") || allow) {
  37. // 如果用户想登陆,或者执行的是allow方法则不拦截,使之通过
  38. // invocation.invoke()继续运行拦截器后续的处理
  39.  
  40. return invocation.invoke();
  41.  
  42. } else {
  43. if (session.isEmpty() || session == null) {
  44. // 如果session为空,则让用户登陆
  45. return "login";
  46. } else {
  47. String userId = session.get("userId").toString();
  48. if (userId == null) {
  49. // session不为空,但是session中没有用户信息
  50. // 让用户登陆
  51. return "login";
  52. } else {
  53. // 用户已经登陆,登陆成功
  54. return invocation.invoke();
  55. }
  56. }
  57. }
  58. }
  59. }

 

二、过滤不想被拦截的方法

在默认的配置中,是拦截所有的方法,对于部分不需要拦截的方法,则需要进行特殊的处理。

 

LoginInterceptor类中:

 

 
  1. String name = invocation.getInvocationContext().getName();

 

这个name是获取请求的方法,由于,我们对部分方法可能不需要拦截,因此让其直接继续执行后续的处理操作。这种常见的情况是,我们前台首页的查询action,我们是不需要拦截的。我们可以将不需要拦截的方法定义在allow中,也可以定义在配置文件中。本文为了方便起见,定义了一个boolean的变量allow。

 

 
  1. if (name.equals("login") || allow) {
  2. return invocation.invoke();
  3. }

invocation.invoke();是继续执行后续操作。

 

三、修改Struts.xml配置文件,加入拦截器配置

Struts.xml配置如下:

 

 
  1. <package name="author" namespace="/author" extends="struts-default">
  2.  
  3. <interceptors>
  4. <interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
  5. <interceptor-stack name="loginCheck">
  6. <interceptor-ref name="login"></interceptor-ref>
  7. <interceptor-ref name="defaultStack"></interceptor-ref>
  8. </interceptor-stack>
  9. </interceptors>
  10. <default-interceptor-ref name="loginCheck"></default-interceptor-ref>
  11.  
  12. <global-results>
  13. <result name="login" type="redirect">/login.jsp</result>
  14. <result name="illegal" type="redirect">/illegal.jsp</result>
  15. </global-results>
  16.  
  17. </package>

这里需要说明一下的就是,对于这个拦截器的配置,可以加到需要拦截的package里面,也可以当度的放在一个package里面,然后其他的package继承我们的这个author package即可。

 

 
  1. <package name="User" namespace="/user" extends="struts-default,author">

 

ps: 同样也可以在指定的action中进行配置

 
  1. <interceptor-ref name="loginCheck"></interceptor-ref>

这个拦截器,但是这对每一个需要拦截的action都需要加入这个配置,对于大量的配置文件来说是比较繁琐的,因此我们只需定义一个package配置即可。

另外,对于拦截器方法过滤也可以继承 MethodFilterInterceptor这个类来实现.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值