您的位置:首页 > 编程语言 > Java开发

java+struts2防盗链(filter不可过滤action)

2010-10-28 10:00 435 查看

Java+struts2

防盗链


Author:Rose(wangjiaoe)

Time:20101028

前段时间使用到了防盗链,使用时用的是过滤器
filter
,其中遇到了问题,最后对
action
无法过滤问题得到了解决,这儿写个小笔记记录一下。

防盗链
:

解释一下什么是防盗链:就是防止在没有通过合理的登陆界面,直接进入到系统中.

优点:避免在每个页面判断是否获得
session
,虽然在里也是判断是否或的
session
,但是代码简单,重用性高.

1步:建立一个类实现
Filter

package com.l99.filter;
import java.io.IOException;
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.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 实现filter ()
*
* @author filter
*
*/
public class LoginFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

HttpSession session = ((HttpServletRequest) request).getSession();
System.out.println(session.getAttribute("userInfo"));//测试用
//测试用,获取请求的地址	System.out.println(((HttpServletRequest)request).getRequestURI();
//如果是登录就放行
if ("/RightManage/login.jsp".equals(((HttpServletRequest) request)
.getRequestURI()))
// 放行
chain.doFilter(request, response);
} else {
if (session.getAttribute("userInfo") == null) {
// 重定向到登录界面,或提示没有权限
((HttpServletResponse)response).sendRedirect("/login.jsp");
}
}
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}


2.
配置XML:

<!-- 防盗链过滤器 -->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.l99.filter.LoginFilter</filter-class>//文件全路径
</filter>
//下面是你要防盗的页面,可以有多个或一个,因为在大型项目中,jsp页面分类会很细,可能装载在不同的文件夹所以可以有多对
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/form/cfa/*</url-pattern> //过滤在form文件夹下,cfa子文件夹中的jsp页面
</filter-mapping>


注释:测试就实现了简单的登录过滤

二:加入

struts2 ,



action

进入过滤


注意:

Filter

好像只可以过滤

jsp

,不可以过滤

action

,过滤

action

最好用拦截器


1.


XML

配置


<!-- 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>




2.


创建拦截器类


,实现

Interceptor


package com.l99.web.right.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.l99.right.ManageUserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 登录、权限拦截器 ,实现interceptor
* @author Owner
*
*/
public class LoginInterceptor implements Interceptor{
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
/**
* 拦截器
*/
public String intercept(ActionInvocation invocation) throws Exception {

//获取uri
//获取request
ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);
//获取session
HttpSession session = request.getSession();
//获取请求的路径
String path = request.getRequestURI();
//判断是否登录,如果登录判断是否有访问的权限
if(session.getAttribute("userInfo")== null){
// 重定向到登录界面
//request.getRequestDispatcher("/login.jsp"); 此方式用下面的 Action.LOGIN;代替
return Action.LOGIN;
}else{
//判断访问的是否是 需要指定的权限的用户
if(path.contains("/sysFun/right.action")){
ManageUserInfo userInfo = (ManageUserInfo) session.getAttribute("userInfo");
if(!"超级管理员".equals(userInfo.getRoleName())){
request.setAttribute("error", "对不起,您没有访问权限");
return Action.ERROR;
}
}
}
return invocation.invoke();
}
}




3.


struts.xml

配置


<package name="sysFun" namespace="/sysFun" extends = "struts-default">
<!-- 拦截器 -->
<interceptors>
<interceptor name="loginInterceptor"
class="com.l99.web.right.interceptor.LoginInterceptor">
<param name="hello">Hello world</param>
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<!-- struts2默认拦截器  <interceptor-ref name="defaultStack"></interceptor-ref>-->
</interceptor-stack>
</interceptors>
<!--global-results放的位置顺序不对会报错, 全局变量error -->
<global-results>
<result name="error">/WEB-INF/pages/error.jsp</result>
<!-- LoginInterceptor中的Action.LOGIN对应找到name -->
<result name="login">/login.jsp</result>
</global-results>

<action name="right" method="right" class = "com.l99.web.right.EditManageSysFunAction">
<result >
/WEB-INF/pages/manage_sysfun/right.jsp
</result>
<!-- 引用拦截器: 拦截action    -->
<interceptor-ref name="mystack"></interceptor-ref>
</action>
……………其它action
</package>




注意:

拦截器类中的
return

Action.
LOGIN

;

找到的是
struts2

struts.xml
中的全局变量

<
global-results
>

<
result
name
=
"error"
>
/WEB-INF/pages/error.jsp
</
result
>

<!-- LoginInterceptor
中的
Action.LOGIN
对应找到
name -->

<
result
name
=
"login"
>
/login.jsp
</
result
>

</
global-results
>

中的
name=login
,返回到相应的地方,这儿是登录界面
/login.jsp

到这儿就完成了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: