【发布时间】:2016-05-24 14:39:05
【问题描述】:
我正在使用 struts 2 和 hibernate 开发一个 java web 应用程序。我想通过直接在地址栏上键入来限制用户调用任何 struts 操作。相反,用户应该使用 JSP 页面本身提供的链接,因为在我的应用程序中有许多访问级别,所以现在用户通过直接在地址栏上键入操作名称来进行未经授权的访问。在返回成功之前,我已经检查了每个功能上登录用户的访问级别。但这不是到处检查的好习惯。我搜索了如何使用 java Filters 来执行此操作,但没有成功。
我用来实现过滤器的东西如下:-
web.xml(Security 是我的包名,SessionFilter 是 servlet 类)
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>
Security.SessionFilter
</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>Index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Index.jsp 是我的应用程序的入口点,所以我希望只允许通过在地址栏上键入来直接访问此页面。如果用户在地址栏上键入任何其他操作名称,他/她应该再次被重定向到登录页面,这就是为什么在下面的代码中我写了这个 response.sendRedirect("Index.jsp");
SessionFilter.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
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 SessionFilter implements Filter {
private ArrayList<String> urlList;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean allowedRequest = false;
if (urlList.contains(url)) {
allowedRequest = true;
}
if (!allowedRequest) {
HttpSession session = request.getSession(false);
if (null == session) {
response.sendRedirect("Index.jsp");
}
}
chain.doFilter(req, res);
}
public void init(FilterConfig config) throws ServletException {
String urls = config.getInitParameter("avoid-urls");
StringTokenizer token = new StringTokenizer(urls, ",");
urlList = new ArrayList<String>();
while (token.hasMoreTokens()) {
urlList.add(token.nextToken());
}
}
}
【问题讨论】:
-
“我想限制用户通过直接在地址栏上输入来调用任何 struts 操作”,然后“我希望只允许通过在地址栏上输入来直接访问此页面”。互相矛盾。
-
我认为无法通过直接在地址栏中输入或单击链接来检查用户是否访问特定页面。您应该在服务器端实现适当的安全性(例如存储一些会话变量等)
-
问题确实很奇怪,因为您在过滤器中无处检查登录用户,但前提是是否创建了 HTTP 会话(“拥有会话”!=“登录用户“!)。至少,这能提供洞察力吗? stackoverflow.com/q/13274279
标签: jsp struts2 servlet-filters