如何禁用从 url 直接访问 jsp 页面的页面
Posted
技术标签:
【中文标题】如何禁用从 url 直接访问 jsp 页面的页面【英文标题】:how to disable direct access to pages from url for jsp pages 【发布时间】:2016-02-03 14:29:17 【问题描述】:我创建了一个网络应用程序。一切正常。但是,如果用户没有登录,他们仍然可以通过 url 访问其他 jsp 页面。我想停止 url 访问。我看到了一些例子,它显示了过滤器的用法。我是过滤器的新手,我不知道如何实现它。我正在使用 servlet、dao 和 jsp 页面。
请建议我怎么做。我想为所有 jsp 或 servlet 页面制作一个过滤器。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.eis.servlet.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.eis.servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>DayWiseServlet</servlet-name>
<servlet-class>com.eis.servlet.DayWiseServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.eis.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RetrieveServlet</servlet-name>
<servlet-class>com.eis.servlet.RetrieveServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RetrieveServlet</servlet-name>
<url-pattern>/RetrieveServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TimeSheet</servlet-name>
<servlet-class>com.eis.servlet.TimeSheet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TimeSheet</servlet-name>
<url-pattern>/TimeSheet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DayWiseServlet</servlet-name>
<url-pattern>/DayWiseServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
loginservlet.java
public class LoginServlet extends HttpServlet
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String n=request.getParameter("Emp_id");
String p=request.getParameter("Pwd");
String Usertype=request.getParameter("usertype");
HttpSession session = request.getSession(false);
if(session!=null)
session.setAttribute("name", n);
session.setAttribute("usertype", Usertype);
if(LoginDao.validate(n,p))
RequestDispatcher rd=request.getRequestDispatcher("/daywise.jsp");
rd.forward(request,response);
else
out.print("<p style=\"color:red\">Sorry Employee ID or password error</p>");
RequestDispatcher rd=request.getRequestDispatcher("/index.jsp");
rd.include(request,response);
out.close();
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
doGet(request, response);
我的过滤器:
public class MyFilter implements Filter
@Override
public void init(FilterConfig config) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
if(null==((String) req.getSession().getAttribute("empid")) || ((String) req.getSession().getAttribute("empid")).equals(""))
chain.doFilter(req, resp);
else
resp.sendRedirect("/WebTimeSheet/index.jsp");
@Override
public void destroy()
登录页面:
<form action="LoginServlet" method="post">
<fieldset style="width: 300px">
<legend> Login to App </legend>
<table>
<tr>
<td>User ID</td>
<td><input type="text" name="Emp_id" required="required" /></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="Pwd" required="required" /></td>
</tr>
<tr>
<td>User Type</td>
<td> <select name="usertype">
<option>Employee</option>
<option>Manager</option>
<option>Admin</option>
</select></td>
</tr>
<tr>
<td><input type="submit" value="Login" /></td>
</tr>
</table>
</fieldset>
</form>
</body>
<%@include file="/footer.jsp" %>
</html>
我所有的 jsp 页面都在 web pages 文件夹中,该文件夹位于 Web-inf 文件夹之外。 Web-inf 文件夹只有 web.xml 初始化
Header.jsp
<c:choose>
<c:when test="$usertype eq 'Employee'">
<div class="nav">
<ul><li class="container"><img src="$pageContext.request.contextPath/images/enabling.jpg" /></li>
<li class="current"><a href="WEB-INF/daywise.jsp">DayWise TimeSheet</a></li>
<li><a href="WEB-INF/timesheet.jsp">Weekly TimeSheet</a></li>
</ul>
</div>
</c:when>
<c:when test="$usertype eq 'Manager'">
<div class="nav">
<ul><li class="container"><img src="$pageContext.request.contextPath/images/enabling.jpg" /></li>
<li class="current"><a href="/WEB-INF/daywise.jsp">DayWise TimeSheet</a></li>
<li><a href="WEB-INF/timesheet.jsp">Weekly TimeSheet</a></li>
<li><a href="WEB-INF/newemployee.jsp">Add New Employeer</a></li>
<li><a href="WEB-INF/retrieve.jsp">Retrieve TimeSheet</a></li>
</ul>
</div>
</c:when>
【问题讨论】:
您可以按照本教程了解 servlet 过滤器进行身份验证。 brendangraetz.wordpress.com/2010/06/17/… 【参考方案1】:首先,JSP 不应该用于服务请求,它们应该用于呈现视图。应该使用 Servlet 来处理请求,然后转发到 JSP。
这是一个例子:
public class HelloWorld extends HttpServlet
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
//do some stuff
//forward to JSP to show result
String nextJSP = "/WEB_INF/result.jsp";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
dispatcher.forward(request,response);
在 web.xml 中:
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>your.package.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/someurl</url-pattern>
</servlet-mapping>
在本例中,servlet 转发到 WEB-INF 目录中的 JSP。把你所有的 JSP 都放在 WEB-INF 目录下,就意味着不能直接请求它们。
现在你有了一个 Servlet,你可以设置一个 Servlet 过滤器:
public class MyFilter implements Filter
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException
if (isLoggedIn)
//if user is logged in, complete request
chain.doFilter(req, res);
else
//not logged in, go to login page
res.sendRedirect("/login");
在 web.xml 中:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>your.package.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/secret/*</url-pattern>
</filter-mapping>
这样,任何符合/secret/*
模式的 URL 都会被过滤,因此需要登录。
【讨论】:
我试过了,但还是一样,代码 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse resp=(HttpServletResponse)响应; if(null==((String) req.getSession().getAttribute("empid")) || ((String) req.getSession().getAttribute("empid")).equals("")) 链.doFilter(req, resp); else resp.sendRedirect("/WebTimeSheet/index.jsp"); 我确实在 WEB-INF/JSP 文件中添加了 jsp 页面,但它给出了 http 状态 404 错误 它正在工作,谢谢......但是一个小问题......我提供的菜单链接不起作用......请帮助我如何在标题中链接到 jsp 页面。 请检查上面的代码 header.jsp 代码并帮助我如何将 header 链接到 jsp 页面。 "把你所有的JSP都放到WEB-INF目录下,就意味着不能直接请求。"不幸的是,这对 Jetty 来说似乎是不正确的。如果输入的 URL 包含“WEB-INF”,仍然可以渲染 JSP 文件。【参考方案2】:您需要使用 servlet 过滤器并匹配所有请求。
您需要在该过滤器中检查授权。
这里是official docs with example
【讨论】:
@SURESHATTA 感谢它的工作......但现在的问题是我的菜单的网址不起作用,因为我们无法直接访问......我的菜单也不起作用......请通过标题.jsp 代码并帮助我。 @dpk 你可能有一些错误。【参考方案3】:您可以在响应标头中设置身份验证cookie
Cookie someCookie = new Cookie("cookie_name","some_value" );
还有response.addCookie(someCookie)
然后,在您的过滤器中,您可以根据 cookie 值决定调用 chain.doFilter(req, res)
。
您可以通过cookie.setMaxAge();
即控制cookie 年龄。在注销时将最大年龄设置为“0”。
【讨论】:
@ketan 请检查上面的代码添加指导我如何更改代码。由于我是过滤器和 cookie 的新手,所以我不知道在哪里放置代码,也告诉我我的 url 是否有问题 请检查上面的代码添加指导我如何更改代码。由于我是过滤器和 cookie 的新手,所以我不知道在哪里放置代码,也告诉我我的 url 是否有问题以上是关于如何禁用从 url 直接访问 jsp 页面的页面的主要内容,如果未能解决你的问题,请参考以下文章