Struts2 实现 Java 防盗链解决方案

需积分: 15 11 下载量 151 浏览量 更新于2024-09-15 收藏 23KB DOCX 举报
"Java+Struts2防盗链技术实现与问题解决" 在Java Web开发中,Struts2作为流行的MVC框架,常被用于构建企业级应用。然而,随着网络安全问题日益凸显,防止非法访问,尤其是防止“防盗链”成为了一个重要的需求。防盗链主要是为了防止未经授权的外部网站直接引用或链接到网站的资源,如图片、视频或文件,从而避免带宽被滥用。本篇将探讨如何在Java和Struts2环境下实现防盗链功能,并解决Filter无法过滤Action的问题。 首先,我们需要创建一个自定义的Filter来实现防盗链的功能。Filter在Java Servlet规范中扮演着拦截请求和响应的角色,可以在请求到达Action之前进行预处理,或者在响应返回给客户端之前进行后处理。以下是一个简单的LoginFilter的实现: ```java 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; 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")); // 在此处添加防盗链的判断逻辑 } } ``` 在这个Filter中,我们可以获取到当前的HttpSession,并检查是否已经登录(例如,通过判断session中的"userInfo"属性)。如果用户未登录,我们可以阻止请求继续传递给Action,从而达到防盗链的效果。 然而,问题在于,有时Filter可能无法过滤Action,这可能是由于Struts2的配置问题或者Filter的配置不正确导致的。为了解决这个问题,我们需要确保Filter能正确地拦截到Action请求。在`web.xml`文件中,需要正确配置Filter,使其在Struts2的DispatcherServlet之前执行: ```xml <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.l99.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 此外,确保Struts2的配置文件(`struts.xml`)中,Action的配置允许Filter进行拦截。默认情况下,Struts2的`Action`会跳过Filter,因此需要在`struts.xml`中设置`filter`属性为`true`: ```xml <action name="yourActionName" class="your.ActionClass"> <interceptor-ref name="defaultStack"/> <!-- 配置filter属性为true --> <filter>true</filter> <result>success.jsp</result> </action> ``` 通过这种方式,Filter就能有效地拦截Action请求,执行防盗链的逻辑。在实际应用中,防盗链的判断可以更加复杂,例如检查HTTP头中的Referer字段,或者使用更安全的身份验证机制,如JWT(JSON Web Tokens)。 总结,Java+Struts2的防盗链实现主要依赖于Filter,通过对请求进行拦截并检查用户登录状态,以及正确配置Filter和Struts2的Action,可以有效地防止非法访问。在设计和实现过程中,要充分考虑安全性和用户体验,确保系统的稳定和高效。