-1

私は spring mvc が初めてで、Web プロジェクトの管理パネルに取り組んでいます。

これが私の管理ページコントローラーの例です:

@Controller
@RequestMapping("/admin/article/**")
public class ArticleController {
    private ArticleDao articleDao;
    private String fileName;
    private String baseUrl;

    public ArticleController() {
        articleDao = ArticleDaoFactory.create();
    }
    @RequestMapping(value = "/admin/article",method = RequestMethod.GET)
    public String doGet(ModelMap model,HttpServletRequest request,ArticleForm articleForm) {
        //some codes
    }


    @RequestMapping(value = "/admin/article/add",method = RequestMethod.GET)
    public String doGetAdd(ModelMap model,ArticleForm articleForm) {
        model.addAttribute("article", articleForm);
        return "admin/articleAdd";
    }
    @RequestMapping(value = "/admin/article/add",method = RequestMethod.POST)
    public String doPost(@ModelAttribute ArticleForm article, BindingResult result ,ModelMap model){
        //some codes
    }

    @RequestMapping(value = "/admin/article/edit/{id}",method = RequestMethod.GET)
    public String getEdit(ModelMap model, @PathVariable("id") int id) {
        //some codes
    }

    @RequestMapping(value = "/admin/article/edit/{id}",method = RequestMethod.POST)
    public String postEdit(ModelMap model, @PathVariable("id") int id, ArticleForm article, BindingResult result) {
        //some codes
    }
    @RequestMapping(value = "/admin/article/delete/{id}",method = RequestMethod.GET)
    public void getDelete(ModelMap model, @PathVariable("id") int id, HttpServletResponse response) {
        //some codes
    }
}

ここで、AdminController という名前の別のコントローラー (たとえば) に別のマッピングが必要であり、管理者を認証し、ログインしていない場合はログイン ページに移動します。確かに認証は 1 つの例です。

私の認証クラスにはリクエストとセッションの参照が必要であることに注意してください(そして、他のクラスには春によって作成された他の参照が必要です)

コンストラクター メソッドを使用して HttpServletRequest を取得できないことがわかったので、別のリクエスト マッピングを作成してメソッドを呼び出しました。

この方法でプロパティを設定できますが、すべての管理 URL でこの方法を使用することはできません。

@Controller
@RequestMapping(value = "/admin/**",method = RequestMethod.GET)
public class AdminController {
    Authentication authentication;
    HttpServletRequest request;
    HttpSession session;
    HttpServletResponse response;
    public void checkAndSet(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        authentication = new Authentication(session,request);
        this.request = request;
        this.session = session;
        this.response = response;
        if(!authentication.isLoggedIn()){
            System.out.println(" I'm not logged in");
            response.setHeader("Location","/admin/login");
        }

    }

それで、「管理者」ページの子である他のすべてのコントローラーでメソッドを呼び出すために、コントローラーにリクエストマッピングを記述する方法についていくつか提案が必要ですか?

参考までに:私はこれについて春のセキュリティを考えていません。

ありがとう;

4

1 に答える 1

1

サーブレットフィルターを実装することでできると思います。

例えば ​​:

public class AuthenticationFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String url = request.getServletPath();
        HttpSession session = request.getSession(false);
        Authentication authentication = new Authentication(session,request);


        if (isAdminUrl(url) && !authentication.isLoggedIn()) {
            res.sendRedirect/admin/login");
        }
        chain.doFilter(req, res);
    }
}

isAdminUrl(String url)次に、フィルターを適用するかどうかを決定するメソッドを実装する必要があります。

それ以外の場合は、 Spring Securityをご覧になることを強くお勧めします

于 2015-11-10T13:26:03.283 に答える