如何防止servlet直接通过浏览器调用

时间:2013-12-04 04:55:02

标签: java servlets

我正在使用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)调用

如果有任何办法,请建议我。

3 个答案:

答案 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。