我正在开发使用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
是入口poi nt我的应用程序,所以我想只允许通过在地址栏上输入,直接访问此页面。而如果用户键入地址栏上,他的任何其他动作名称/她应该被重定向到下面的代码再次that'swhy登录页我写了这个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会话时(或“有一个会话“!=”登录用户“!)。至少,这是否提供了见解? http://stackoverflow.com/q/13274279 – BalusC