我正在使用java servlet和jsp页面开发一个Web项目。在其中一个servlet中,我们有RequestDispatcher方法,它正在调用另一个servlet。
@WebServlet("/Demo") public class DemoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.sendRedirect("testing"); //calling other servlet } }
{{1}}
所以,现在我想防止直接从浏览器调用contextRoot / testing,而只是让它从其他servlet(Demo)调用
如果有任何办法,请建议我。
答案 0 :(得分:4)
存在一些技术:
查看编写HTTP请求过滤器。然后,如果模式与您不希望直接调用的servlet路径匹配,则可以检查传入的请求和url并拒绝它。
另一种机制是使用web.xml中的安全性约束来允许仅对授权用户/角色访问应用程序中的各种路径。查看<security-constraint>
web.xml
代码
答案 1 :(得分:1)
“Romin”给出的答案是正确的。你必须使用过滤器。你可以做的是,你可以在访问“/ Demo”url时设置一个新的会话变量,并在过滤器中检查会话存在的条件,如果存在则允许url或者throw错误。你可以做类似的事情。在“演示”servlet中
@WebServlet("/Demo")
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
HttpSession session = request.getSession() //get new session
res.sendRedirect("testing"); //calling other servlet
}
}
在Filter类中添加以下代码
@WebFilter("/login")
public class MyFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpRequest request = (HttpRequest) req;
HttpResponse respone = (HttpResponse) res;
HttpSession session = request.getSession(false) //get the existing session object
if(null != session) {
chain.doFilter(req, resp);
} else {
"redirect to some error page or home page"
}
}
public void destroy() {}
}
答案 2 :(得分:0)
一种方法是使用ServletRequest.getRemoteAddr()检查呼叫者的ip,如果没有在本地调用则拒绝它
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
if(!req.getRemoteAddr().equals("127.0.0.1")) { // reject }
}
但是这种方法不起作用合法调用者(例如:proxy)也使用相同的ip。