Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
2016-08-08 10:26
916 查看
对于Struts2、Spring3、Hibernate3集成使用的项目来说,对用户请求的控制是非常重要的,有些操作需要用户登录后才能执行。如果不做任何限制,则action可以直接在浏览器中输入action地址来执行相应的action.本文主要解决的就是
①浏览器地址栏中直接输入url访问action的问题
②过滤不想被拦截的方法
例如对于如下链接:
http://localhost:8080/absSys/delete.action?id=1
直接在浏览器中提交上述地址,delete操作依然能执行!因此,必须对用户提交的请求进行拦截处理,如果用户没有登录,则跳转至登录页面。
一、浏览器地址栏中直接输入url访问action的问题
Struts2提供了拦截器,我们编写自己的拦截器的时候,只需要继承抽象类AbstractInterceptor,然后override intercept()方法就可以了。
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
public void destroy() {
System.out.println("Destory");
}
public void init() {
System.out.println("Init");
}
/**
* @return result
* */
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("action执行之前");
String name = invocation.getInvocationContext().getName();
System.out.println("请求方法:" + name);
ActionContext ac = invocation.getInvocationContext();
Map<String, Object> session = ac.getSession();
boolean allow = name.equals("infolist") || name.equals("xwgg")
|| name.equals("pxdt") || name.equals("noticethrid")
|| name.equals("gqpx") || name.equals("gp")
|| name.equals("np") || name.equals("sp")
|| name.equals("wypx") || name.equals("zgks")
|| name.equals("shpx") || name.equals("fwxz")
|| name.equals("noticesec") || name.equals("filedown");
if (name.equals("login") || allow) {
// 如果用户想登陆,或者执行的是allow方法则不拦截,使之通过
// invocation.invoke()继续运行拦截器后续的处理
return invocation.invoke();
} else {
if (session.isEmpty() || session == null) {
// 如果session为空,则让用户登陆
return "login";
} else {
String userId = session.get("userId").toString();
if (userId == null) {
// session不为空,但是session中没有用户信息
// 让用户登陆
return "login";
} else {
// 用户已经登陆,登陆成功
return invocation.invoke();
}
}
}
}
}
二、过滤不想被拦截的方法
在默认的配置中,是拦截所有的方法,对于部分不需要拦截的方法,则需要进行特殊的处理。
LoginInterceptor类中:
String name = invocation.getInvocationContext().getName();
这个name是获取请求的方法,由于,我们对部分方法可能不需要拦截,因此让其直接继续执行后续的处理操作。这种常见的情况是,我们前台首页的查询action,我们是不需要拦截的。我们可以将不需要拦截的方法定义在allow中,也可以定义在配置文件中。本文为了方便起见,定义了一个boolean的变量allow。
if (name.equals("login") || allow) {
return invocation.invoke();
}
invocation.invoke();是继续执行后续操作。
三、修改Struts.xml配置文件,加入拦截器配置
Struts.xml配置如下:
<package name="author" namespace="/author" extends="struts-default">
<interceptors>
<interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
<interceptor-stack name="loginCheck">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="loginCheck"></default-interceptor-ref>
<global-results>
<result name="login" type="redirect">/login.jsp</result>
<result name="illegal" type="redirect">/illegal.jsp</result>
</global-results>
</package>
这里需要说明一下的就是,对于这个拦截器的配置,可以加到需要拦截的package里面,也可以当度的放在一个package里面,然后其他的package继承我们的这个author package即可。
<package name="User" namespace="/user" extends="struts-default,author">
ps: 同样也可以在指定的action中进行配置
<interceptor-ref name="loginCheck"></interceptor-ref>
这个拦截器,但是这对每一个需要拦截的action都需要加入这个配置,对于大量的配置文件来说是比较繁琐的,因此我们只需定义一个package配置即可。
另外,对于拦截器方法过滤也可以继承 MethodFilterInterceptor这个类来实现.
转载自:http://blog.csdn.net/llhwin2010/article/details/8873034
①浏览器地址栏中直接输入url访问action的问题
②过滤不想被拦截的方法
例如对于如下链接:
http://localhost:8080/absSys/delete.action?id=1
直接在浏览器中提交上述地址,delete操作依然能执行!因此,必须对用户提交的请求进行拦截处理,如果用户没有登录,则跳转至登录页面。
一、浏览器地址栏中直接输入url访问action的问题
Struts2提供了拦截器,我们编写自己的拦截器的时候,只需要继承抽象类AbstractInterceptor,然后override intercept()方法就可以了。
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
public void destroy() {
System.out.println("Destory");
}
public void init() {
System.out.println("Init");
}
/**
* @return result
* */
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("action执行之前");
String name = invocation.getInvocationContext().getName();
System.out.println("请求方法:" + name);
ActionContext ac = invocation.getInvocationContext();
Map<String, Object> session = ac.getSession();
boolean allow = name.equals("infolist") || name.equals("xwgg")
|| name.equals("pxdt") || name.equals("noticethrid")
|| name.equals("gqpx") || name.equals("gp")
|| name.equals("np") || name.equals("sp")
|| name.equals("wypx") || name.equals("zgks")
|| name.equals("shpx") || name.equals("fwxz")
|| name.equals("noticesec") || name.equals("filedown");
if (name.equals("login") || allow) {
// 如果用户想登陆,或者执行的是allow方法则不拦截,使之通过
// invocation.invoke()继续运行拦截器后续的处理
return invocation.invoke();
} else {
if (session.isEmpty() || session == null) {
// 如果session为空,则让用户登陆
return "login";
} else {
String userId = session.get("userId").toString();
if (userId == null) {
// session不为空,但是session中没有用户信息
// 让用户登陆
return "login";
} else {
// 用户已经登陆,登陆成功
return invocation.invoke();
}
}
}
}
}
二、过滤不想被拦截的方法
在默认的配置中,是拦截所有的方法,对于部分不需要拦截的方法,则需要进行特殊的处理。
LoginInterceptor类中:
String name = invocation.getInvocationContext().getName();
这个name是获取请求的方法,由于,我们对部分方法可能不需要拦截,因此让其直接继续执行后续的处理操作。这种常见的情况是,我们前台首页的查询action,我们是不需要拦截的。我们可以将不需要拦截的方法定义在allow中,也可以定义在配置文件中。本文为了方便起见,定义了一个boolean的变量allow。
if (name.equals("login") || allow) {
return invocation.invoke();
}
invocation.invoke();是继续执行后续操作。
三、修改Struts.xml配置文件,加入拦截器配置
Struts.xml配置如下:
<package name="author" namespace="/author" extends="struts-default">
<interceptors>
<interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
<interceptor-stack name="loginCheck">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="loginCheck"></default-interceptor-ref>
<global-results>
<result name="login" type="redirect">/login.jsp</result>
<result name="illegal" type="redirect">/illegal.jsp</result>
</global-results>
</package>
这里需要说明一下的就是,对于这个拦截器的配置,可以加到需要拦截的package里面,也可以当度的放在一个package里面,然后其他的package继承我们的这个author package即可。
<package name="User" namespace="/user" extends="struts-default,author">
ps: 同样也可以在指定的action中进行配置
<interceptor-ref name="loginCheck"></interceptor-ref>
这个拦截器,但是这对每一个需要拦截的action都需要加入这个配置,对于大量的配置文件来说是比较繁琐的,因此我们只需定义一个package配置即可。
另外,对于拦截器方法过滤也可以继承 MethodFilterInterceptor这个类来实现.
转载自:http://blog.csdn.net/llhwin2010/article/details/8873034
相关文章推荐
- Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
- 改变myeclipse中Java项目的名称,在浏览器中使用新名称访问项目时报404的问题的解决方法!!!
- (转)javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法
- Android实现简易浏览器遇到问题的解决方法
- javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法
- 解决了浏览器URL地址栏直接输入get参数值包含中文时的urlencode编码格式问题
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结 (fflush() setbuf() )
- 文本框限制输入(半角,全角互转),以及控制输入法问题,解决方法整合
- UrlRewritingNet 实现URL重写 映射 真实的.html(例如FCKeditor)无法访问的解决方法 .
- java:struts学习(3)-jsp传递中文到action的解决方法,简易!!
- 文本框限制输入(半角,全角互转),以及控制输入法问题,解决方法整合
- jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法
- Java URLConnection 类,通过设置浏览器类型来解决访问受限问题
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结.
- Java程序中遇到的乱码问题以及解决方法
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- window.open关于浏览器拦截问题分析及解决方法
- 在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究
- Java程序中遇到的乱码问题以及解决方法
- window.open关于浏览器拦截问题分析及解决方法